﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
using DevExpress.XtraBars;
using DevExpress.XtraEditors;
using DevExpress.XtraTreeList;
using DevExpress.XtraTreeList.Columns;
using DevExpress.XtraTreeList.Nodes;
using NNS.Framework;
using NNS.UI;

namespace QLTB.Quyen.UI
{
    [System.ComponentModel.ToolboxItem(false)]
    public partial class ucQuyen : MyUIBase
    {
        public ucQuyen()
        {
            InitializeComponent();
            Nap();
        }

        public int Id { get; set; }

        public string Caption
        {
            set { colTenMenu.Caption = "Chức Năng (" + value + ")"; }
        }

        public void Nap()
        {
            Nap(Id);
        }

        public void Nap(int ID)
        {
            Id = ID;
            dsQuyen.Quyen.Rows.Clear();
            SqlHelper.Helper.Fill(CommandType.Text,
                                  "SELECT TBL_quyen.id, TBL_quyen.idnhom, TBL_quyen.menu, TBL_quyen.xem, TBL_quyen.thaydoi, TBL_quyen.tatca, TBL_quyen.taomoi,TBL_menu.TenMenu, TBL_menu.menuCha FROM TBL_quyen INNER JOIN TBL_menu ON TBL_quyen.menu = TBL_menu.id WHERE  (TBL_quyen.idnhom = @idnhom) ORDER BY TBL_menu.Ordering",
                                  dsQuyen.Quyen, new[] {new SqlParameter("@idnhom", ID)});
            tl.ExpandAll();
        }

        public override void Save()
        {
            if (Id == 0)
            {
                XtraMessageBox.Show("Nhóm người dùng này không được thay đổi", "Cảnh Báo", MessageBoxButtons.OK,
                                    MessageBoxIcon.Warning);
                Nap(0);
                return;
            }
            Cursor.Current = Cursors.WaitCursor;
            Enabled = false;
            //TBL_quyenDA da=new TBL_quyenDA();
            //DataTable dt = dsQuyen.Quyen;
            //for (int i = 0; i < dt.Rows.Count; i++)
            //{
            //    DataRow dr = dt.Rows[i];

            //    if (da.Update((int) dr["id"], (int) dr["idnhom"], (string) dr["menu"], (bool) dr["xem"],
            //              (bool) dr["thaydoi"], (bool) dr["taomoi"], (bool) dr["tatca"])<0)
            //    {
            //        ShowWarning(SqlHelper.Helper.LastError.Message, "Phân quyền người dùng");
            //        return;
            //    }

            //}

            try
            {
                quyenTableAdapter.Connection.ConnectionString = DbHelper.ConnectionString;
                quyenTableAdapter.Update(dsQuyen.Quyen);
            }
            catch (Exception ex)
            {
                ShowWarning(ex.Message, "Phân quyền người dùng");
            }


            NotSave = false;
            OnSaveChanged(new SaveChangedEventArgs {NotSave = false});

            //quyenTableAdapter.Connection.ConnectionString = SqlHelper.ConnectionString;
            //quyenTableAdapter.Update(dsQuyen);
            Enabled = true;
            Cursor.Current = Cursors.Default;
        }


        private void NodeCheck(CellValueChangedEventArgs e)
        {
            #region Tao Mới

            if (e.Column == coltaomoi)
            {
                if (e.Node.ParentNode != null)
                {
                    if (!Convert.ToBoolean(e.Node.ParentNode.GetValue(coltaomoi)))
                    {
                        e.Node.SetValue(coltaomoi, false);
                        e.Node.ParentNode.SetValue(coltaomoi, false);
                        return;
                    }
                }

                bool val = Convert.ToBoolean(e.Value);
                if (val)
                {
                    e.Node.SetValue(colxem, val);
                    ChildrenCheck(colxem, e.Node, val);
                }
                e.Node.SetValue(coltaomoi, e.Value);

                if (e.Node.HasChildren)
                {
                    //e.Node.SetValue(coltatca, val);
                    e.Node.SetValue(coltaomoi, val);
                    for (int i = 0; i < e.Node.Nodes.Count; i++)
                    {
                        e.Node.Nodes[i].SetValue(coltaomoi, val);
                        ChildrenCheck(coltaomoi, e.Node.Nodes[i], val);
                    }
                }
            }
                #endregion

                #region thaydoi

            else if (e.Column == colthaydoi)
            {
                if (e.Node.ParentNode != null)
                {
                    if (!Convert.ToBoolean(e.Node.ParentNode.GetValue(colthaydoi)))
                    {
                        e.Node.SetValue(colthaydoi, false);
                        e.Node.ParentNode.SetValue(colthaydoi, false);
                        return;
                    }
                }

                bool val = Convert.ToBoolean(e.Value);
                if (val)
                {
                    e.Node.SetValue(colxem, val);
                    ChildrenCheck(colxem, e.Node, val);
                }

                e.Node.SetValue(colthaydoi, e.Value);

                if (e.Node.HasChildren)
                {
                    e.Node.SetValue(colthaydoi, val);
                    for (int i = 0; i < e.Node.Nodes.Count; i++)
                    {
                        e.Node.Nodes[i].SetValue(colthaydoi, val);
                        ChildrenCheck(colthaydoi, e.Node.Nodes[i], val);
                    }
                }
            }
                #endregion

                #region xem

            else if (e.Column == colxem)
            {
                if (e.Node.ParentNode != null)
                {
                    if (!Convert.ToBoolean(e.Node.ParentNode.GetValue(colxem)))
                    {
                        e.Node.SetValue(colxem, false);
                        e.Node.ParentNode.SetValue(colxem, false);
                        return;
                    }
                }

                bool val = Convert.ToBoolean(e.Value);
                //if (val)
                //{
                //    e.Node.SetValue(colxem, val);
                //    ChildrenCheck(colxem, e.Node, true);
                //}
                e.Node.SetValue(colxem, e.Value);


                if (e.Node.HasChildren)
                {
                    e.Node.SetValue(colxem, val);
                    for (int i = 0; i < e.Node.Nodes.Count; i++)
                    {
                        e.Node.Nodes[i].SetValue(colxem, val);
                        ChildrenCheck(colxem, e.Node.Nodes[i], val);
                    }
                }
            }

            #endregion
        }

        private void ChildrenCheck(TreeListColumn column, TreeListNode node, object value)
        {
            #region tatca

            if (column == coltatca)
            {
                if (node.HasChildren)
                {
                    for (int i = 0; i < node.Nodes.Count; i++)
                    {
                        node.Nodes[i].SetValue(coltatca, value);
                        ChildrenCheck(coltatca, node.Nodes[i], value);
                    }
                }
            }

            #endregion

            #region taomoi

            if (column == coltaomoi)
            {
                if (node.HasChildren)
                {
                    for (int i = 0; i < node.Nodes.Count; i++)
                    {
                        node.Nodes[i].SetValue(coltaomoi, value);
                        ChildrenCheck(coltaomoi, node.Nodes[i], value);
                    }
                }
            }
                #endregion

                #region thaydoi

            else if (column == colthaydoi)
            {
                if (node.HasChildren)
                {
                    for (int i = 0; i < node.Nodes.Count; i++)
                    {
                        node.Nodes[i].SetValue(colthaydoi, value);
                        ChildrenCheck(colthaydoi, node.Nodes[i], value);
                    }
                }
            }
                #endregion

                #region xem

            else if (column == colxem)
            {
                if (node.HasChildren)
                {
                    for (int i = 0; i < node.Nodes.Count; i++)
                    {
                        node.Nodes[i].SetValue(colxem, value);
                        ChildrenCheck(colxem, node.Nodes[i], value);
                    }
                }
            }

            #endregion
        }

        private void tl_CellValueChanging(object sender, CellValueChangedEventArgs e)
        {
            if (Id == 0)
            {
                XtraMessageBox.Show("Nhóm người dùng này không được thay đổi", "Cảnh Báo", MessageBoxButtons.OK,
                                    MessageBoxIcon.Warning);
                Nap(0);
                return;
            }

            Cursor.Current = Cursors.WaitCursor;
            Enabled = false;
            NotSave = true;
            OnSaveChanged(new SaveChangedEventArgs {NotSave = true});

            #region MyRegion

            if (e.Column == coltatca)
            {
                if (e.Node.ParentNode != null)
                {
                    if (!Convert.ToBoolean(e.Node.ParentNode.GetValue(coltatca)))
                    {
                        e.Node.SetValue(coltatca, false);
                        e.Node.ParentNode.SetValue(coltatca, false);
                        Enabled = true;
                        Cursor.Current = Cursors.Default;
                        return;
                    }
                }
                e.Node.SetValue(coltatca, e.Value);

                bool val = Convert.ToBoolean(e.Value);

                e.Node.SetValue(coltaomoi, val);
                ChildrenCheck(coltaomoi, e.Node, val);
                e.Node.SetValue(colxem, val);
                ChildrenCheck(colxem, e.Node, val);
                e.Node.SetValue(colthaydoi, val);
                ChildrenCheck(colthaydoi, e.Node, val);


                if (e.Node.HasChildren)
                {
                    val = Convert.ToBoolean(e.Value);
                    e.Node.SetValue(coltatca, val);
                    for (int i = 0; i < e.Node.Nodes.Count; i++)
                    {
                        e.Node.Nodes[i].SetValue(coltatca, val);
                        ChildrenCheck(coltatca, e.Node.Nodes[i], val);
                    }
                }
            }

            #endregion

            NodeCheck(e);
            Enabled = true;
            Cursor.Current = Cursors.Default;
        }

        private void iExpand_ItemClick(object sender, ItemClickEventArgs e)
        {
        }

        private void iSimple_ItemClick(object sender, ItemClickEventArgs e)
        {
            tl.CollapseAll();
        }

        private void chxExpand_CheckedChanged(object sender, EventArgs e)
        {
            if (!chxExpand.Checked)
            {
                tl.ExpandAll();
                chxExpand.Text = "Thu hẹp";
            }
            else
            {
                tl.CollapseAll();
                chxExpand.Text = "Mở rộng";
            }
        }
    }
}